Intro
For this assessment I used different data sources, all form the open data portal of the City Bruges which can be found here: OpenDataBrugge.
At the beginning I was not sure what I wanted to map because I had no idea what insights the open data could give me. Therefore I started to use QGIS and imported almost every interesting file that is available on the website. In my opinion QGIS is easier to get insight of your data then RStudio. This because it takes some time to create a map in RStudio if you do not have any clue what is the data about and when it is the first time you use R.
Quite fast I found a one KML file that I used as a base layer, the districts in Bruges. Because this map was very detailed I used QGIS to create the dissolve function (with the provided “sectorname” as unique field) to create a new shapefile with the different sectors in Bruges. Now I could use two shapefiles (districts and sectors). The other data files I used in both maps are:
- The road accidents from 2014 – 2016 (KML file - QGIS)
- Population per district (csv file - RStudio)
- Age of inhabitants per district (csv file - RStudio)
For both maps I used quite a different approach on how to map the valuable data. Therefore I will review both workflows separately.
In QGIS started to map the accident file and the sector file. The accidents where illustrated with points inside the sector (polygons), which was very unclear (chaotic). In the dataset the year of the accident was stated which gave me the option to create new layers for every year (filtered and saved the new layer). By using the points per polygon built-in function, I could extract the amount of accidents per sector. I did this for every year separately and the total accidents, after I joined each file based on their sector name, this gave me a table with the sectors, accidents in 2014, 2015, 2016 and the total accidents. I used the total accidents to colour the different polygons, and used the different year accidents to create histograms.
In RStudio I used the different shaped files I created using QGIS, I could not find a solution to use KML files directly into RStudio. I started with the population data which I appended with the different districts. After doing some data cleaning (drop Na rows) and data expansion (add total population), I aggregated the dataframe with the Sectornames as unique value, and took the sum of the other numeric values (Male, Female, Total, Surface). Now I could append the sector shapefile in order to be able to plot the values. Hereafter I did some data enriching calculated:
- Total Males in Bruges
- Total Females in Bruges
- Total population
Which made it possible to calculate:
- Rate of Males
- Rate of Females
- Rate of Population
- Population density
Besides the use of the population I added the age of the population per sector. After creating bins manually, I appended the district file, aggregated on the sectorname, and appended the sector file. Therefore I could use the different bins to see how diverse the ages per sector in Bruges are.
After using both programs, I think that GIS is an interesting tool get insights in your data. But when you get to the point to create maps and enrich data I prefer RStudio.
Results:
RStudio
Population Map
OpenStreetMapData read with read_osm is static, so not usable in view mode. Please use tm_basemap or tm_tiles, with the provider name set to "Esri.WorldStreetMap"
Age Maps
OpenStreetMapData read with read_osm is static, so not usable in view mode. Please use tm_basemap or tm_tiles, with the provider name set to "Esri.WorldStreetMap"
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIEludHJvDQpGb3IgdGhpcyBhc3Nlc3NtZW50IEkgdXNlZCBkaWZmZXJlbnQgZGF0YSBzb3VyY2VzLCBhbGwgZm9ybSB0aGUgb3BlbiBkYXRhIHBvcnRhbCBvZiB0aGUgQ2l0eSBCcnVnZXMgd2hpY2ggY2FuIGJlIGZvdW5kIGhlcmU6IFtPcGVuRGF0YUJydWdnZV0oaHR0cHM6Ly93d3cuYnJ1Z2dlLmJlL29wZW5kYXRhKS4gDQoNCkF0IHRoZSBiZWdpbm5pbmcgSSB3YXMgbm90IHN1cmUgd2hhdCBJIHdhbnRlZCB0byBtYXAgYmVjYXVzZSBJIGhhZCBubyBpZGVhIHdoYXQgaW5zaWdodHMgdGhlIG9wZW4gZGF0YSBjb3VsZCBnaXZlIG1lLiBUaGVyZWZvcmUgSSBzdGFydGVkIHRvIHVzZSBRR0lTIGFuZCBpbXBvcnRlZCBhbG1vc3QgZXZlcnkgaW50ZXJlc3RpbmcgZmlsZSB0aGF0IGlzIGF2YWlsYWJsZSBvbiB0aGUgd2Vic2l0ZS4gSW4gbXkgb3BpbmlvbiBRR0lTIGlzIGVhc2llciB0byBnZXQgaW5zaWdodCBvZiB5b3VyIGRhdGEgdGhlbiBSU3R1ZGlvLiBUaGlzIGJlY2F1c2UgaXQgdGFrZXMgc29tZSB0aW1lIHRvIGNyZWF0ZSBhIG1hcCBpbiBSU3R1ZGlvIGlmIHlvdSBkbyBub3QgaGF2ZSBhbnkgY2x1ZSB3aGF0IGlzIHRoZSBkYXRhIGFib3V0IGFuZCB3aGVuIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHlvdSB1c2UgUi4NCg0KUXVpdGUgZmFzdCBJIGZvdW5kIGEgb25lIEtNTCBmaWxlIHRoYXQgSSB1c2VkIGFzIGEgYmFzZSBsYXllciwgdGhlIGRpc3RyaWN0cyBpbiBCcnVnZXMuIEJlY2F1c2UgdGhpcyBtYXAgd2FzIHZlcnkgZGV0YWlsZWQgSSB1c2VkIFFHSVMgdG8gY3JlYXRlIHRoZSBkaXNzb2x2ZSBmdW5jdGlvbiAod2l0aCB0aGUgcHJvdmlkZWQg4oCcc2VjdG9ybmFtZeKAnSBhcyB1bmlxdWUgZmllbGQpIHRvIGNyZWF0ZSBhIG5ldyBzaGFwZWZpbGUgd2l0aCB0aGUgZGlmZmVyZW50IHNlY3RvcnMgaW4gQnJ1Z2VzLiBOb3cgSSBjb3VsZCB1c2UgdHdvIHNoYXBlZmlsZXMgKGRpc3RyaWN0cyBhbmQgc2VjdG9ycykuDQpUaGUgb3RoZXIgZGF0YSBmaWxlcyBJIHVzZWQgaW4gYm90aCBtYXBzIGFyZToNCg0KLSBUaGUgcm9hZCBhY2NpZGVudHMgZnJvbSAyMDE0IOKAkyAyMDE2IChLTUwgZmlsZSAtIFFHSVMpDQotIFBvcHVsYXRpb24gcGVyIGRpc3RyaWN0IChjc3YgZmlsZSAtIFJTdHVkaW8pDQotIEFnZSBvZiBpbmhhYml0YW50cyBwZXIgZGlzdHJpY3QgKGNzdiBmaWxlIC0gUlN0dWRpbykNCg0KRm9yIGJvdGggbWFwcyBJIHVzZWQgcXVpdGUgYSBkaWZmZXJlbnQgYXBwcm9hY2ggb24gaG93IHRvIG1hcCB0aGUgdmFsdWFibGUgZGF0YS4gVGhlcmVmb3JlIEkgd2lsbCByZXZpZXcgYm90aCB3b3JrZmxvd3Mgc2VwYXJhdGVseS4NCg0KSW4gUUdJUyBzdGFydGVkIHRvIG1hcCB0aGUgYWNjaWRlbnQgZmlsZSBhbmQgdGhlIHNlY3RvciBmaWxlLiBUaGUgYWNjaWRlbnRzIHdoZXJlIGlsbHVzdHJhdGVkIHdpdGggcG9pbnRzIGluc2lkZSB0aGUgc2VjdG9yIChwb2x5Z29ucyksIHdoaWNoIHdhcyB2ZXJ5IHVuY2xlYXIgKGNoYW90aWMpLiBJbiB0aGUgZGF0YXNldCB0aGUgeWVhciBvZiB0aGUgYWNjaWRlbnQgd2FzIHN0YXRlZCB3aGljaCBnYXZlIG1lIHRoZSBvcHRpb24gdG8gY3JlYXRlIG5ldyBsYXllcnMgZm9yIGV2ZXJ5IHllYXIgKGZpbHRlcmVkIGFuZCBzYXZlZCB0aGUgbmV3IGxheWVyKS4gQnkgdXNpbmcgdGhlIHBvaW50cyBwZXIgcG9seWdvbiBidWlsdC1pbiBmdW5jdGlvbiwgSSBjb3VsZCBleHRyYWN0IHRoZSBhbW91bnQgb2YgYWNjaWRlbnRzIHBlciBzZWN0b3IuIEkgZGlkIHRoaXMgZm9yIGV2ZXJ5IHllYXIgc2VwYXJhdGVseSBhbmQgdGhlIHRvdGFsIGFjY2lkZW50cywgYWZ0ZXIgSSBqb2luZWQgZWFjaCBmaWxlIGJhc2VkIG9uIHRoZWlyIHNlY3RvciBuYW1lLCB0aGlzIGdhdmUgbWUgYSB0YWJsZSB3aXRoIHRoZSBzZWN0b3JzLCBhY2NpZGVudHMgaW4gMjAxNCwgMjAxNSwgMjAxNiBhbmQgdGhlIHRvdGFsIGFjY2lkZW50cy4gSSB1c2VkIHRoZSB0b3RhbCBhY2NpZGVudHMgdG8gY29sb3VyIHRoZSBkaWZmZXJlbnQgcG9seWdvbnMsIGFuZCB1c2VkIHRoZSBkaWZmZXJlbnQgeWVhciBhY2NpZGVudHMgdG8gY3JlYXRlIGhpc3RvZ3JhbXMuDQoNCkluIFJTdHVkaW8gSSB1c2VkIHRoZSBkaWZmZXJlbnQgc2hhcGVkIGZpbGVzIEkgY3JlYXRlZCB1c2luZyBRR0lTLCBJIGNvdWxkIG5vdCBmaW5kIGEgc29sdXRpb24gdG8gdXNlIEtNTCBmaWxlcyBkaXJlY3RseSBpbnRvIFJTdHVkaW8uIEkgc3RhcnRlZCB3aXRoIHRoZSBwb3B1bGF0aW9uIGRhdGEgd2hpY2ggSSBhcHBlbmRlZCB3aXRoIHRoZSBkaWZmZXJlbnQgZGlzdHJpY3RzLiBBZnRlciBkb2luZyBzb21lIGRhdGEgY2xlYW5pbmcgKGRyb3AgTmEgcm93cykgYW5kIGRhdGEgZXhwYW5zaW9uIChhZGQgdG90YWwgcG9wdWxhdGlvbiksIEkgYWdncmVnYXRlZCB0aGUgZGF0YWZyYW1lIHdpdGggdGhlIFNlY3Rvcm5hbWVzIGFzIHVuaXF1ZSB2YWx1ZSwgYW5kIHRvb2sgdGhlIHN1bSBvZiB0aGUgb3RoZXIgbnVtZXJpYyB2YWx1ZXMgKE1hbGUsIEZlbWFsZSwgVG90YWwsIFN1cmZhY2UpLiBOb3cgSSBjb3VsZCBhcHBlbmQgdGhlIHNlY3RvciBzaGFwZWZpbGUgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBwbG90IHRoZSB2YWx1ZXMuIEhlcmVhZnRlciBJIGRpZCBzb21lIGRhdGEgZW5yaWNoaW5nIGNhbGN1bGF0ZWQ6DQoNCi0JVG90YWwgTWFsZXMgaW4gQnJ1Z2VzDQotCVRvdGFsIEZlbWFsZXMgaW4gQnJ1Z2VzDQotCVRvdGFsIHBvcHVsYXRpb24NCg0KV2hpY2ggbWFkZSBpdCBwb3NzaWJsZSB0byBjYWxjdWxhdGU6DQoNCi0JUmF0ZSBvZiBNYWxlcw0KLQlSYXRlIG9mIEZlbWFsZXMNCi0JUmF0ZSBvZiBQb3B1bGF0aW9uIA0KLQlQb3B1bGF0aW9uIGRlbnNpdHkNCg0KQmVzaWRlcyB0aGUgdXNlIG9mIHRoZSBwb3B1bGF0aW9uIEkgYWRkZWQgdGhlIGFnZSBvZiB0aGUgcG9wdWxhdGlvbiBwZXIgc2VjdG9yLiBBZnRlciBjcmVhdGluZyBiaW5zIG1hbnVhbGx5LCBJIGFwcGVuZGVkIHRoZSBkaXN0cmljdCBmaWxlLCBhZ2dyZWdhdGVkIG9uIHRoZSBzZWN0b3JuYW1lLCBhbmQgYXBwZW5kZWQgdGhlIHNlY3RvciBmaWxlLiBUaGVyZWZvcmUgSSBjb3VsZCB1c2UgdGhlIGRpZmZlcmVudCBiaW5zIHRvIHNlZSBob3cgZGl2ZXJzZSB0aGUgYWdlcyBwZXIgc2VjdG9yIGluIEJydWdlcyBhcmUuDQoNCkFmdGVyIHVzaW5nIGJvdGggcHJvZ3JhbXMsIEkgdGhpbmsgdGhhdCBHSVMgaXMgYW4gaW50ZXJlc3RpbmcgdG9vbCBnZXQgaW5zaWdodHMgaW4geW91ciBkYXRhLiBCdXQgd2hlbiB5b3UgZ2V0IHRvIHRoZSBwb2ludCB0byBjcmVhdGUgbWFwcyBhbmQgZW5yaWNoIGRhdGEgSSBwcmVmZXIgUlN0dWRpby4NCg0KIyBSZXN1bHRzOg0KIyMgUUdJUw0KDQohW1FHSVMtTUFQIG9mIEJydWdlc10oTjovVUNML0dJUy9Bc3Nlc3NtZW50UGFydDEvQnJ1Z2dlL0Fzc2Vzc21lbnQxUnN0dWRpby9Bc3Nlc3NtZW50MS9RR0lTLU1hcC5wbmcpDQoNCg0KIyMgUlN0dWRpbw0KDQpgYGB7ciBMaWJyYXJpZXMsIGluY2x1ZGU9RkFMU0V9DQojIE9wZW4gYWxsIG5lZWRlZCBsaWJyYXJpZXMgLS0tLQ0KbGlicmFyeShzcCkNCmxpYnJhcnkobWFwdG9vbHMpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoY2xhc3NJbnQpDQpsaWJyYXJ5KE9wZW5TdHJlZXRNYXApDQpsaWJyYXJ5KHJnZW9zKQ0KbGlicmFyeSh0bWFwKQ0KbGlicmFyeSh0bWFwdG9vbHMpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShyZ2RhbCkNCmxpYnJhcnkoZ2VvanNvbmlvKQ0KYGBgDQoNCmBgYHtyIERhdGEgKGFkZCtmaWx0ZXIpLCBpbmNsdWRlPUZBTFNFfQ0KDQojIEFkZCBEYXRhIC0tLS0tDQoNCiNCcnVnZXMgU2VjdG9yDQpicnVnZXNzZWN0b3IgPC0gcmVhZF9zaGFwZSgiTjovVUNML0dJUy9Bc3Nlc3NtZW50UGFydDEvQnJ1Z2dlL0Fzc2Vzc21lbnQxUnN0dWRpby9CcnVnZXNNU0hQL011bmljaXBhbGl0aWVzLnNocCIsIGFzLnNmID0gVFJVRSkNCg0KI0JydWdlcyBEaXN0cmljdA0KYnJ1Z2VzZGlzdHJpY3QgPC0gcmVhZF9zaGFwZSgiTjovVUNML0dJUy9Bc3Nlc3NtZW50UGFydDEvQnJ1Z2dlL0Fzc2Vzc21lbnQxUnN0dWRpby9CcnVnZXNTSFAvQnJ1Z2VzLnNocCIsIGFzLnNmID0gVFJVRSkNCg0KI0JydWdlcyBwb3B1bGF0aW9uDQpwb3B1bGF0aW9uIDwtIHJlYWQuY3N2KCJOOi9VQ0wvR0lTL0Fzc2Vzc21lbnRQYXJ0MS9CcnVnZ2UvQXNzZXNzbWVudDFSc3R1ZGlvL2RhdGEvZ2VzbGFjaHRwZXJzZWN0b3JfMS5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiOyIpDQoNCiNCcnVnZXMgQWdlDQphZ2VzIDwtIHJlYWQuY3N2KCJOOi9VQ0wvR0lTL0Fzc2Vzc21lbnRQYXJ0MS9CcnVnZ2UvQXNzZXNzbWVudDFSc3R1ZGlvL0RhdGEvbGVlZnRpamRwZXJzdGF0c2VjMjAxOC5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiOyIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCg0KIyBGaWx0ZXIgb25seSBuZWVkZWQgY29sdW1ucyAtLS0tDQpicnVnZXNzZWN0b3IgPC0gYnJ1Z2Vzc2VjdG9yWywyMl0NCmJydWdlc2Rpc3RyaWN0QWdlIDwtIGJydWdlc2Rpc3RyaWN0WyxjKDIwLDIxKV0NCmJydWdlc2Rpc3RyaWN0IDwtIGJydWdlc2Rpc3RyaWN0WyxjKDEzLDIwLDIxKV0NCnBvcHVsYXRpb24gPC0gcG9wdWxhdGlvblssMTozXQ0KYWdlcyA8LSBhZ2VzWywxOjEwN10NCg0KYGBgDQoNCmBgYHtyIEFwcGVuZCBEYXRhICwgaW5jbHVkZT1GQUxTRX0NCg0KI3BvcHVsYXRpb24gLS0tLQ0KI0FwcGVuZCBCcnVnZXNkaXN0cmljdCBkYXRhIHRvIHBvcHVsYXRpb24NCmRhdGFicnVnZXNkaXN0cmljdCA8LSBhcHBlbmRfZGF0YShicnVnZXNkaXN0cmljdCxwb3B1bGF0aW9uLCBrZXkuc2hwID0gIlNlY25hYW0iLCBrZXkuZGF0YSA9ICJTZWN0b3JuYWFtIiwgaWdub3JlLmR1cGxpY2F0ZXMgPSBUUlVFLCBpZ25vcmUubmEgPSBUUlVFKQ0KDQojQWRkIFBvcHVsYXRpb24gDQpkYXRhYnJ1Z2VzZGlzdHJpY3QkUG9wdWxhdGlvbiA8LSBkYXRhYnJ1Z2VzZGlzdHJpY3QkTWFuICsgZGF0YWJydWdlc2Rpc3RyaWN0JFZyb3V3DQoNCiNyZXBsYWNlIGRhdGF0eXBlDQojIFVzZWQgc291cmNlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM0MTgxMjgvaG93LXRvLWNvbnZlcnQtYS1mYWN0b3ItdG8taW50ZWdlci1udW1lcmljLXdpdGhvdXQtbG9zcy1vZi1pbmZvcm1hdGlvbg0KZGF0YWJydWdlc2Rpc3RyaWN0JE9wcGVydmwgPC0gYXMubnVtZXJpYyhsZXZlbHMoZGF0YWJydWdlc2Rpc3RyaWN0JE9wcGVydmwpKQ0KDQojRHJvcCByb3dzIHdoZXJlIG1hbGVzIG9yIGZlbWFsZXMgaXMgbmENCmRhdGFicnVnZXNkaXN0cmljdCA8LSBkYXRhYnJ1Z2VzZGlzdHJpY3RbKCFpcy5uYShkYXRhYnJ1Z2VzZGlzdHJpY3QkTWFuKSkgJiAoIWlzLm5hKGRhdGFicnVnZXNkaXN0cmljdCRWcm91dykpLCBdDQoNCiNHcm91cCBieSBkaWZmZXJlbnQgU2Vjb3RvcnMNCmRhdGFicnVnZXNzZWN0b3IgPC0gYWdncmVnYXRlKGxpc3QoZGF0YWJydWdlc2Rpc3RyaWN0JE1hbixkYXRhYnJ1Z2VzZGlzdHJpY3QkVnJvdXcsIGRhdGFicnVnZXNkaXN0cmljdCRQb3B1bGF0aW9uLCBkYXRhYnJ1Z2VzZGlzdHJpY3QkT3BwZXJ2bCksYnkgPSBsaXN0KGRhdGFicnVnZXNkaXN0cmljdCROQUFNKSwgc3VtKQ0KDQpjb2xuYW1lcyhkYXRhYnJ1Z2Vzc2VjdG9yKSA8LSBjKCJTZWN0b3IiLCAiTWFsZXMiLCAiRmVtYWxlcyIsIlBvcHVsYXRpb24iLCJPcHBlcnZsIikNCg0KI0FwcGVuZCBCcnVnZXNzZWN0b3IgZGF0YSB0byBwb3B1bGF0aW9uIHBlciBzZWN0b3IgdG8gbWFwIA0KZGF0YWJydWdlcyA8LSBhcHBlbmRfZGF0YShicnVnZXNzZWN0b3IsZGF0YWJydWdlc3NlY3Rvciwga2V5LnNocCA9ICJOQUFNIiwga2V5LmRhdGEgPSAiU2VjdG9yIiwgaWdub3JlLmR1cGxpY2F0ZXMgPSBUUlVFLCBpZ25vcmUubmEgPSBUUlVFKQ0KDQojIEFnZSAtLS0tDQojcmVwbGFjZSBuYSB2YWx1ZSB3aXRoIDANCmRhdGEgPC0gYXMuZGF0YS5mcmFtZShhZ2VzKQ0KYWdlc1tpcy5uYShkYXRhKV0gPC0gMA0KI2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9b2dMdjBVVG05OHMNCmFnZWJpbnMgPC0gYXMuZGF0YS5mcmFtZShhZ2VzJFNlY3Rvcm5hYW0pDQpjb2xuYW1lcyhhZ2ViaW5zKSA8LSBjKCJTZWN0b3JuYWFtIikNCg0KYWdlYmluc1siMS05Il0gICA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDI6MTFdKSkgIA0KYWdlYmluc1siMTAtMTkiXSA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDEyOjIxXSkpIA0KYWdlYmluc1siMjAtMjkiXSA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDIyOjMxXSkpIA0KYWdlYmluc1siMzAtMzkiXSA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDMyOjQxXSkpIA0KYWdlYmluc1siNDAtNDkiXSA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDQyOjUxXSkpIA0KYWdlYmluc1siNTAtNTkiXSA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDUyOjYxXSkpIA0KYWdlYmluc1siNjAtNjkiXSA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDYyOjcxXSkpIA0KYWdlYmluc1siNzAtNzkiXSA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDcyOjgxXSkpIA0KYWdlYmluc1siODAtODkiXSA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDgyOjkxXSkpIA0KYWdlYmluc1siOTAtOTkiXSA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDkyOjEwMV0pKQ0KYWdlYmluc1siMTAwKyJdICA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDEwMjoxMDddKSkNCg0KDQojYWdlYmluc1siMC0xNCJdICA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDI6MTddKSkgIA0KI2FnZWJpbnNbIjE1LTI0Il0gPC0gcm93U3VtcyhGaWx0ZXIoaXMubnVtZXJpYyxhZ2VzWywxODoyMV0pKSANCiNhZ2ViaW5zWyIyNS00NCJdIDwtIHJvd1N1bXMoRmlsdGVyKGlzLm51bWVyaWMsYWdlc1ssMjI6MzFdKSkgDQojYWdlYmluc1siNDUtNjQiXSA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDMyOjQxXSkpIA0KI2FnZWJpbnNbIjY1KyJdICA8LSByb3dTdW1zKEZpbHRlcihpcy5udW1lcmljLGFnZXNbLDQyOjUxXSkpIA0KI2FnZWJpbnNbIjUwLTU5Il0gPC0gcm93U3VtcyhGaWx0ZXIoaXMubnVtZXJpYyxhZ2VzWyw1Mjo2MV0pKQ0KDQojYWdlbWVhbiA8LSBhcy5kYXRhLmZyYW1lKGFnZXMkU2VjdG9ybmFhbSkNCiNhZ2VtZWFuWyJNZWFuIl0gPC0gcm93U3VtcyhGaWx0ZXIoaXMubnVtZXJpYyxhZ2VzKSkNCg0KZGF0YWJydWdlc2Rpc3RyaWN0YWdlIDwtIGFwcGVuZF9kYXRhKGJydWdlc2Rpc3RyaWN0QWdlLGFnZWJpbnMsIGtleS5zaHAgPSAiU2VjbmFhbSIsIGtleS5kYXRhID0gIlNlY3Rvcm5hYW0iLCBpZ25vcmUuZHVwbGljYXRlcyA9IFRSVUUsIGlnbm9yZS5uYSA9IFRSVUUpDQoNCiNkcm9wIG5hIHZhbHVlcw0KZGF0YWJydWdlc2Rpc3RyaWN0YWdlIDwtIGRhdGFicnVnZXNkaXN0cmljdGFnZVshaXMubmEoZGF0YWJydWdlc2Rpc3RyaWN0YWdlJGAxLTlgKSxdDQoNCmRhdGFicnVnZXNzZWN0b3JhZ2UgPC0gYWdncmVnYXRlKGxpc3QoZGF0YWJydWdlc2Rpc3RyaWN0YWdlJGAxLTlgLGRhdGFicnVnZXNkaXN0cmljdGFnZSRgMTAtMTlgLCBkYXRhYnJ1Z2VzZGlzdHJpY3RhZ2UkYDIwLTI5YCxkYXRhYnJ1Z2VzZGlzdHJpY3RhZ2UkYDMwLTM5YCxkYXRhYnJ1Z2VzZGlzdHJpY3RhZ2UkYDQwLTQ5YCxkYXRhYnJ1Z2VzZGlzdHJpY3RhZ2UkYDUwLTU5YCxkYXRhYnJ1Z2VzZGlzdHJpY3RhZ2UkYDYwLTY5YCwgZGF0YWJydWdlc2Rpc3RyaWN0YWdlJGA3MC03OWAsZGF0YWJydWdlc2Rpc3RyaWN0YWdlJGA4MC04OWAsZGF0YWJydWdlc2Rpc3RyaWN0YWdlJGA5MC05OWAsZGF0YWJydWdlc2Rpc3RyaWN0YWdlJGAxMDArYCksYnkgPWxpc3QoZGF0YWJydWdlc2Rpc3RyaWN0YWdlJE5BQU0pLCBzdW0pDQoNCmNvbG5hbWVzKGRhdGFicnVnZXNzZWN0b3JhZ2UpIDwtIGMoIlNlY3RvciIsIjEtOSIsIjEwLTE5IiwiMjAtMjkiLCIzMC0zOSIsIjQwLTQ5IiwiNTAtNTkiLCI2MC02OSIsIjcwLTc5IiwiODAtODkiLCI5MC05OSIsIjEwMCsiKQ0KDQpzdW1hZ2UxIDwtICBzdW0oZGF0YWJydWdlc3NlY3RvcmFnZVsyXSkNCnN1bWFnZTEwIDwtIHN1bShkYXRhYnJ1Z2Vzc2VjdG9yYWdlWzNdKQ0Kc3VtYWdlMjAgPC0gc3VtKGRhdGFicnVnZXNzZWN0b3JhZ2VbNF0pDQpzdW1hZ2UzMCA8LSBzdW0oZGF0YWJydWdlc3NlY3RvcmFnZVs1XSkNCnN1bWFnZTQwIDwtIHN1bShkYXRhYnJ1Z2Vzc2VjdG9yYWdlWzZdKQ0Kc3VtYWdlNTAgPC0gc3VtKGRhdGFicnVnZXNzZWN0b3JhZ2VbN10pDQpzdW1hZ2U2MCA8LSBzdW0oZGF0YWJydWdlc3NlY3RvcmFnZVs4XSkNCnN1bWFnZTcwIDwtIHN1bShkYXRhYnJ1Z2Vzc2VjdG9yYWdlWzldKQ0Kc3VtYWdlODAgPC0gc3VtKGRhdGFicnVnZXNzZWN0b3JhZ2VbMTBdKQ0Kc3VtYWdlOTAgPC0gc3VtKGRhdGFicnVnZXNzZWN0b3JhZ2VbMTFdKQ0Kc3VtYWdlMTAwPC0gc3VtKGRhdGFicnVnZXNzZWN0b3JhZ2VbMTJdKQ0KDQpkYXRhYnJ1Z2Vzc2VjdG9yYWdlWyIxLTkiXSAgIDwtIChkYXRhYnJ1Z2Vzc2VjdG9yYWdlWzJdIC8gc3VtYWdlMSApKiAxMDANCmRhdGFicnVnZXNzZWN0b3JhZ2VbIjEwLTE5Il0gPC0gKGRhdGFicnVnZXNzZWN0b3JhZ2VbM10gLyBzdW1hZ2UxMCkgKiAxMDANCmRhdGFicnVnZXNzZWN0b3JhZ2VbIjIwLTI5Il0gPC0gKGRhdGFicnVnZXNzZWN0b3JhZ2VbNF0gLyBzdW1hZ2UyMCkgKiAxMDANCmRhdGFicnVnZXNzZWN0b3JhZ2VbIjMwLTM5Il0gPC0gKGRhdGFicnVnZXNzZWN0b3JhZ2VbNV0gLyBzdW1hZ2UzMCkgKiAxMDANCmRhdGFicnVnZXNzZWN0b3JhZ2VbIjQwLTQ5Il0gPC0gKGRhdGFicnVnZXNzZWN0b3JhZ2VbNl0gLyBzdW1hZ2U0MCkgKiAxMDANCmRhdGFicnVnZXNzZWN0b3JhZ2VbIjUwLTU5Il0gPC0gKGRhdGFicnVnZXNzZWN0b3JhZ2VbN10gLyBzdW1hZ2U1MCkgKiAxMDANCmRhdGFicnVnZXNzZWN0b3JhZ2VbIjYwLTY5Il0gPC0gKGRhdGFicnVnZXNzZWN0b3JhZ2VbOF0gLyBzdW1hZ2U2MCkgKiAxMDANCmRhdGFicnVnZXNzZWN0b3JhZ2VbIjcwLTc5Il0gPC0gKGRhdGFicnVnZXNzZWN0b3JhZ2VbOV0gLyBzdW1hZ2U3MCkgKiAxMDANCmRhdGFicnVnZXNzZWN0b3JhZ2VbIjgwLTg5Il0gPC0gKGRhdGFicnVnZXNzZWN0b3JhZ2VbMTBdIC8gc3VtYWdlODApICogMTAwDQpkYXRhYnJ1Z2Vzc2VjdG9yYWdlWyI5MC05OSJdIDwtIChkYXRhYnJ1Z2Vzc2VjdG9yYWdlWzExXSAvIHN1bWFnZTkwKSAqIDEwMA0KZGF0YWJydWdlc3NlY3RvcmFnZVsiMTAwKyJdICA8LSAoZGF0YWJydWdlc3NlY3RvcmFnZVsxMl0gLyBzdW1hZ2UxMDApICogMTAwDQoNCg0KZGF0YWJydWdlcyA8LSBhcHBlbmRfZGF0YShkYXRhYnJ1Z2VzLGRhdGFicnVnZXNzZWN0b3JhZ2UsIGtleS5zaHAgPSAiTkFBTSIsIGtleS5kYXRhID0gIlNlY3RvciIsIGlnbm9yZS5kdXBsaWNhdGVzID0gVFJVRSwgaWdub3JlLm5hID0gVFJVRSkNCg0KI0NyZWF0ZSBtYXBzDQpicnVnZXNfb3NtPC0gcmVhZF9vc20oZGF0YWJydWdlcywgdHlwZSA9ICJlc3JpIiwgem9vbSA9IE5VTEwpDQoNCmBgYA0KDQpgYGB7ciBlbnJpY2ggRGF0YSAsIGluY2x1ZGU9RkFMU0V9DQoNCiNzdW0gb2YgbWFsZXMgZmVtYWxlcyBhbmQgcG9wdWxhdGlvbg0Kc3VtbWFsZXMgPC0gc3VtKGRhdGFicnVnZXMkTWFsZXMpDQpzdW1mZW1hbGVzIDwtIHN1bShkYXRhYnJ1Z2VzJEZlbWFsZXMpDQpzdW1wb3B1bGF0aW9uIDwtIHN1bShkYXRhYnJ1Z2VzJFBvcHVsYXRpb24pDQoNCiNyYXRlIG1hbGVzIGFuZCBmZW1hbGVzIHBlciBzZWN0b3INCmRhdGFicnVnZXMkUmF0ZU1hbGVzIDwtKGRhdGFicnVnZXMkTWFsZXMgLyBkYXRhYnJ1Z2VzJFBvcHVsYXRpb24gKiAxMDApDQpkYXRhYnJ1Z2VzJFJhdGVGZW1hbGVzIDwtIChkYXRhYnJ1Z2VzJEZlbWFsZXMgLyBkYXRhYnJ1Z2VzJFBvcHVsYXRpb24gKiAxMDApDQpkYXRhYnJ1Z2VzJFJhdGVQb3B1bGF0aW9uIDwtIChkYXRhYnJ1Z2VzJFBvcHVsYXRpb24gLyBzdW1wb3B1bGF0aW9uICogMTAwKQ0KZGF0YWJydWdlcyRPcHBlcnZsIDwtIGRhdGFicnVnZXMkT3BwZXJ2bCAqIDAuMDAwMDAxDQpkYXRhYnJ1Z2VzJERlbnNpdHkgPC0gZGF0YWJydWdlcyRQb3B1bGF0aW9uIC8gZGF0YWJydWdlcyRPcHBlcnZsDQoNCmBgYA0KDQpQb3B1bGF0aW9uIE1hcA0KYGBge3IgY3JlYXRlIHBvcHVsYXRpb24gbWFwLCBlY2hvPUZBTFNFfQ0KI0NyZWF0ZSBtYXBzIC0tLS0NCg0KDQp0bWFwX21vZGUoInZpZXciKQ0KDQpxdG0oYnJ1Z2VzX29zbSkgKyANCiAgdG1fc2hhcGUoZGF0YWJydWdlcykgKyANCiAgdG1fcG9seWdvbnMoYygiUmF0ZU1hbGVzIiwgIlJhdGVGZW1hbGVzIiwiRGVuc2l0eSIpLCANCiAgICBzdHlsZT0iamVua3MiLA0KICAgIHBhbGV0dGU9bGlzdCgiQmx1ZXMiLCJSZWRzIiwiR3JlZW5zIiksDQogICAgdGl0bGU9YygiUmF0ZSBNYWxlcyBQZXIgU2VjdG9yIiwgIlJhdGUgRmVtYWxlcyBwZXIgU2VjdG9yIiwiRGVuc2l0eSBwZXIgU2VjdG9yIikpIA0KDQpgYGANCg0KDQpBZ2UgTWFwcw0KYGBge3IgY3JlYXRlIGFnZSBtYXAsIGVjaG89RkFMU0V9DQojQ3JlYXRlIG1hcHMgLS0tLQ0KDQoNCnRtYXBfbW9kZSgidmlldyIpDQp0bWFwX29wdGlvbnMobGltaXRzID0gYyhmYWNldHMudmlldyA9IDExKSkNCg0KcXRtKGJydWdlc19vc20pICsgDQogIHRtX3NoYXBlKGRhdGFicnVnZXMpICsgDQogIHRtX3BvbHlnb25zKGMoIjEtOSIsIjEwLTE5IiwiMjAtMjkiLCIzMC0zOSIsIjQwLTQ5IiwiNTAtNTkiLCI2MC02OSIsIjcwLTc5IiwiODAtODkiLCI5MC05OSIsIjEwMCsiKSwgDQogICAgc3R5bGU9ImplbmtzIiwNCiAgICBwYWxldHRlPSJCbHVlcyIsDQogICAgdGl0bGU9YygiMS05IiwiMTAtMTkiLCIyMC0yOSIsIjMwLTM5IiwiNDAtNDkiLCI1MC01OSIsIjYwLTY5IiwiNzAtNzkiLCI4MC04OSIsIjkwLTk5IiwiMTAwKyIpKQ0KICANCmBgYA0KICA=